package com.prik.singleton;

/**
 * 懒汉式
 */
// public class Singleton {
//     private static final Singleton instance = new Singleton();
//
//     private Singleton() {
//     }
//
//     public static Singleton getInstance() {
//         return instance;
//     }
// }

/**
 * 懒汉式（线程不安全）
 **/
// public class Singleton {
//     private static Singleton instance;
//
//     private Singleton() {
//     }
//
//     public static Singleton getInstance() {
//         if (instance == null) {
//             return new Singleton();
//         }
//         return instance;
//     }
// }

/**
 * 懒汉式（线程安全）
 **/
// public class Singleton {
//     private static Singleton instance;
//
//     private Singleton() {
//     }
//
//     public static synchronized Singleton getInstance() {
//         if (instance == null) {
//             return new Singleton();
//         }
//         return instance;
//     }
// }

/**
 * 双重检验锁
 **/
// public class Singleton {
//     private volatile static Singleton instance; // 注意volatile修饰
//
//     private Singleton() {
//     }
//
//     public static Singleton getInstance() {
//         if (instance == null) {
//             synchronized (Singleton.class) {
//                 if (instance == null) {
//                     instance = new Singleton();
//                 }
//             }
//             return new Singleton();
//         }
//         return instance;
//     }
// }

/**
 * 静态内部类
 */
public class Singleton {

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
